// 一、请说出下列最终的执行结果，并解释为什么
// var a = [];
// for (var i = 0; i < 10; i++) {
//     a[i] = function() {
//             console.log(i);
//         }
//         // console.log(i);
// }
// a[6]()
// a数组为空，js机制是从上向下执行，当for循环执行完毕才会执行a[6]()调用
// for循环在此作用域中已完成循环，此时var i=i++=10,for的堆应该执行完毕销毁但是由于栈的a[6]()引用，
// i进行了变量提升，导致GC无法回收， 保留了i变量
//即是： a[6]() =>a[i]=>function(){console.log(10)}



// 二、请说出下列最终的执行结果，并解释为什么
// var tmp = 123;
// if (true) {
//     console.log(tmp);
//     let tmp
// }

/*
报错，无法访问：在if作用域内，打印前为未声明和赋值变量，let tmp无法变量提升，所有打印报错
*/

// 三、结合ES6新语法，用最简单的方式找出数组中的最小值
// var arr = [12, 34, 32, 89, 4]
// console.log(Math.min(...arr));

// 四、秦详细说明var ,let,const三种声明变量的方式之间的具体差别
/*
同:1.都是变量声明的关键字；2.都会生成js空间；3.对一个对象、变量的定义，不会定义数据类型
不同：
    var :es5的关键字，存在变量提升
    let :es6的关键字，有效于声明的作用域中，不存在变量提升问题
    const :es6常量的关键字，有效于声明的作用域中，赋值后不可修改,不可重复声明
*/

// 五、请说出下列代码最终输出的结果，并解释为什么
// var a = 10;
// var obj = {
//     a: 20,
//     fn() {
//         setTimeout(() => {
//             console.log(this.a);
//         })
//     }
// }
// obj.fn()
/*
20
var a为全局变量，obj.a为对象内部的属性变量，此时调用obj.fn（）实际调用obj中的fn（）,s其作用域以箭头函数方式，this指向obj
所以this.a  = obj.a
*/


// 六、简述Symbol类型的用途
/*
1.为了解决es5的对象键同名，导致冲突（第三方插件一些键具有特殊含义）
2.可以创建唯一的键，具有不可替代性，对象属性名不可重名
3.可以创建对象私有属性成员
*/

// 七、说说什么是浅拷贝，什么是深拷贝？
/*
浅拷贝（复制、不具继承性）：拷贝当前的节点或者栈的映射地址，修改被拷贝对象的值会触发拷贝对象值改变
深拷贝（复制、枚举、具有继承性）：拷贝的是当前节点及子节点或者开辟一个新的栈与原来的栈属性及值相同，但地址不同；修改一个不会触发另一个改变
*/

// 八、请简述TypeScript 与JavaScript之间的关系
/*
1.ts是基于js的，满足js原有的内置属性、语法规则、api、编码风格
2.ts是在js上的延伸，定义了一整套针对js弱类型语言的缺陷方案，定义了js变量及方法的数据类型，让开发者在编码阶段就能测试出代码的数据类型错误，从而修正代码
3.ts具有静态编译功能，能在编码阶段转义es5、es6各种module的版本，兼容适配不同的浏览器

*/

// 九、请谈谈你所认为的TypeScript优缺点
/*
优点：
1.js是一门弱类型脚本语言，具有高度的灵活性（基于node，不用定义数据类型及函数类型），代码简洁
2.js能支持任意浏览器的编译及渲染，兼容性好
3.js是单线程的，执行效率高（v8引擎） 
4.js支持异步，搭配面向对象，可以很好的处理各种事件在时间节点的不同逻辑判断及反应
缺点：
1.js的弱类型决定了它对各种数据类型处理存在冲突，必要情况，需要在代码中限定数据类型来正确返回逻辑业务
2.js的单线程导致它存在线程阻塞的情况，当某一业务逻辑无法正常执行时，会出现页面卡死丢失报错
*/

// 十、描述引用计数的工作原理和优缺点
/*
原理：设置引用计数器，当空间内的对象的引用关系发生改变时触发，当计数器为0时，触发GC回收机制
优点：
    1.发现垃圾，即时回收
    2.最大限度减少程序暂停：引用计数算法随程序执行而监视，当引用对象空间消耗达到一定上限时，GC机制会检索引用计数为0的对象进行回收
缺点：
    1.对象之间存在循环引用的关系时，引用计数算法无法识别计数，不能触发GC回收机制
    2.时间开销大（时间换空间）
*/

// 十一、描述标记整理算法的工作流程
/*
    1.检索所以的全局活动对象进行标记
    2.整理活动对象和非活动对象，使之分成两个连续的的分布
    3.识别活动对象部分空间，然后GC机制触发，标记清除
    4.形成连续的的可用空间
*/

// 十二、描述V8中新生代存储区垃圾回收的流程
/*
v8引擎具有分代回收机制，分为新生代和老生代
1.新生代分为From和To两个分区
2.当检索全局所有的活动对象时，将其标记并整理，形成连续性的活动对象和非活动对象空间
3.From分区经过标记整理的活动对象空间拷贝至To
4.From与To分区进行置换，完成释放
*/

// 十三、描述增量标记算法在何时使用及工作原理
/*
使用场景：当老生代在GC机制触发垃圾回收时，垃圾回收会阻塞js执行，如果处理空间越大越消耗时间，需要通过标记增量进行优化
原理：将垃圾回收这个过程拆分成一段一段的与及程序执行交替进行，程序执行一段，触发GC,标记增量，释放空间
*/